package exercise;
import java.util.Random;
import java.sql.Array;
import java.util.Arrays;
import java.util.Scanner;

public class Exercise001 {
    public static void main(String[] args) {
        //输入判断是否为闰年
//        System.out.println("请输入一个整数:");
//        Scanner scanner = new Scanner(System.in);
//        int year = scanner.nextInt();
//        //整百年和非整百年
//        if (year % 100 == 0) {
//            if (year % 400 == 0){
//                System.out.println(year + "是闰年");
//            }else{
//                System.out.println(year + "不是闰年");
//            }
//        }else {
//            if (year % 4 == 0){
//                System.out.println(year + "是闰年");
//            }else{
//                System.out.println(year + "不是闰年");
//            }
//        }
////循环输出闰年
//        for (int year = 1000;year <= 2000;year++){
//            if (year % 100 == 0) {
//                if (year % 400 == 0){
//                    System.out.printf("%d,",year);
//                }
//            }else {
//                if (year % 4 == 0){
//                    System.out.printf("%d,",year);
//                }
//            }
//        }




//        //计算1! + 2! + 3! + 4! + 5!的结果
//        int sum = 0;
//        for (int i = 1;i <= 5;i++){
//            int result = 1;
//            for (int j = 1;j <= i;j++){
//                result *= j;
//            }
//            System.out.println(result);
//            sum += result;
//        }
//        System.out.println(sum);




//        //求一个整数，在内存当中存储时，二进制1的个数
//        System.out.println("请输入一个整数:");
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt();
//        int cnt = 0;//计数
//        while (num > 0){
//            //去掉二进制num最右边的1
//            num = num & (num - 1);
//            //更新计数
//            cnt++;
//        }
//        System.out.println(cnt);




//        //求2个整数的最大公约数
//        System.out.println("请输入两个整数:");
//        Scanner scanner = new Scanner(System.in);
//        int num1 = scanner.nextInt();
//        int num2 = scanner.nextInt();
//        int max = 1;
//        //保证num1是较小的数
//        if (num1 > num2){
//            num1 = num1 + num2;
//            num2 = num1 - num2;
//            num1 = num1 - num2;
//        }
//        for (int i = 2;i <= num1;i++){
//            if (num1 % i == 0 && num2 % i == 0){
//                max = i;
//            }
//        }
//        System.out.println(max);




//        //求出0～n之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数，其各位数字的立方和确好等于该数本 身，如；153＝1^3＋5^3＋3^3，则153是一个“水仙花数“。）
//        System.out.println("请输入一个整数:");
//        Scanner scanner =new Scanner(System.in);
//        int n = scanner.nextInt();
//        int g = 0;
//        int s = 0;
//        int b = 0;
//        int tmp = 0;
//        if (n > 999){
//            n = 999;
//        }
//        for (int i = 100;i <= n;i++){
//            //个位
//            g = i % 10;
//            tmp = i / 10;
//            //十位
//            s = tmp % 10;
//            tmp /= 10;
//            //百位
//            b = tmp;
//            //判断为水仙花数则输出
//            if (g * g * g + s * s * s + b * b * b == i){
//                System.out.println(i);
//            }
//        }




//        //输出一个整数的每一位，如：123的每一位是3，2，1
//        System.out.println("请输入一个整数:");
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt();
//        int result = 0;
//        while (num > 0){
//            //个位
//            result = num % 10;
//            System.out.println(result);
//            num /= 10;
//        }




//      //计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值。
//        double sum = 0.0;
//        for (int i = 1;i <= 100;i++) {
//            if (i % 2 == 1) {
//                sum += 1.0 / i;//如果i为奇数,则加
//            } else{
//                sum -= 1.0 / i;//如果i为偶数,则减
//            }
//        }
//        System.out.println(sum);




//        //完成猜数字游戏，用户输入数字，判断该数字是大于，小于，还是等于随机生成的数字，等于的时候退出程序。
//        Random random = new Random();
//        int num = random.nextInt(100) + 1;
//        System.out.println("请输入1-100以内的数字:");
//        Scanner scanner = new Scanner(System.in);
//        while (scanner.hasNextInt()) {
//            int guess = scanner.nextInt();
//            if (0 < guess && guess < 100) {
//                if (guess < num) {
//                    System.out.println("猜小了!");
//                } else if (guess > num) {
//                    System.out.println("猜大了!");
//                } else {
//                    System.out.println("猜对了!");
//                    break;
//                }
//            } else {
//                System.out.println("输入错误,请重新输入!");
//            }
//        }




//        //编写代码模拟三次密码输入的场景。 最多能输入三次密码，密码正确，提示“登录成功”,密码错误， 可以重新输 入，最多输入三次。三次均错，则提示退出程序
//        String password = "abc123456";
//        Scanner scanner = new Scanner(System.in);
//        String input = "0";
//        for (int i = 0;i < 3;i++) {
//            System.out.println("请输入密码:");
//            input = scanner.next();
//            if (input != password){
//                System.out.println("密码错误,请重新输入!");
//            }else{
//                System.out.println("登录成功");
//                break;
//            }
//        }
//        if (input != password) {
//            System.out.println("登录失败,退出程序");
//        }




//        //求1！+2！+3！+4！+........+n!的和(fun1())
//        Scanner scanner = new Scanner(System.in);
//        int n = scanner.nextInt();
//        int sum = 0;
//        for (int i = 1;i <= n;i++){
//            sum += fun1(i);
//        }
//        System.out.println(sum);




//        //求斐波那契数列的第n项。(迭代实现)
//        Scanner scanner = new Scanner(System.in);
//        int n = scanner.nextInt();
//        int x1 = 1;
//        int x2 = 1;
//        int x3 = 2;
//        if (n <= 2){
//            System.out.println(x2);
//        }
//        else if (n == 3){
//            System.out.println(x3);
//        }
//        else {
//            for (int i = 4; i <= n; i++) {
//                x1 = x2;
//                x2 = x3;
//                x3 = x1 + x2;
//            }
//            System.out.println(x3);




//        //求2个整数的最大值，求3个小数的最大值(max())
//        Scanner scanner = new Scanner(System.in);
//        int n1 = scanner.nextInt();
//        int n2 = scanner.nextInt();
//        int n3 = scanner.nextInt();
//        System.out.println(max(n1,n2));
//        System.out.println(max(n1,n2,n3));



//        //递归求 N 的阶乘(fun1())
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt();
//        System.out.println(fun1(num));




//        //递归求 1 + 2 + 3 + ... + 10
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt();
//        System.out.println(sum2(num));




//        //按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)    （递归printNum()）
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt();
//        printNum(num);




//        //输入一个非负整数，返回组成它的数字之和
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt();
//        System.out.println(sumNum(num));




//        //递归求斐波那契数列的第 N 项(fun2())
//        Scanner scanner = new Scanner(System.in);
//        int N = scanner.nextInt();
//        System.out.println(fun2(N));





//        //循环将数组中的每个元素 乘以 2 , 并设置到对应的数组元素上
//        int[] arr = {1, 2, 3};
//        System.out.println(Arrays.toString(transform(arr)));




//        //找出 和为目标值 target 的那 两个 整数(findAdd())
//        int[] nums = {0, 1, 2, 3, 4};
//        int target = 4;
//        System.out.println(Arrays.toString(findAdd(nums,target)));




//        //数组中是否存在连续三个元素都是奇数
//        int[] arr = {1, 2, 3, 7, 5};
//        System.out.println(fun3(arr));




//        //找出那个只出现了一次的元素。
//        int[] arr = {1, 2, 2, 4, 4};
//        System.out.println(findOne(arr));
//
}


    //给定一个非空整数数组(个位数)，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素。
    public static int findOne(int[] arr){
        int[] cot = new int[10];
        for (int i = 0;i < arr.length;i++){
            cot[arr[i]] += 1;
        }
        for (int i = 0;i < cot.length;i++){
            if (cot[i] == 1){
                return i;
            }
        }
        return 0;
    }


    //给你一个整数数组 arr，请你判断数组中是否存在连续三个元素都是奇数的情况：如果存在，请返回 true ；否则，返回 false 。
    public static boolean fun3(int[] arr){
        int flag = 0;
        for (int i = 0;i < arr.length;i++){
            if (arr[i] % 2 == 1){
                flag += 1;
            }
            else{
                flag = 0;
            }
        }
        if (flag == 3) {
            return true;
        }
        return false;
    }

    //给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target 的那 两个 整数，并返回它们的数组下标。
    //
    //你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
    //
    //你可以按任意顺序返回答案。
    //
    //示例 1：
    //输入：nums = [2,7,11,15], target = 9
    //输出：[0,1]
    //解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。
    public static int[] findAdd(int[] nums,int target){
        for (int i = 0;i < nums.length;i++){
            for (int j = i + 1;i <nums.length;j++){
                if (nums[i] + nums[j] == target){
                    int[] result = {i,j};
                    return result;
                }
            }
        }
        return null;
    }


    //实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 , 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}
    public static int[] transform(int[] arr){
        for (int i = 0;i < arr.length;i++){
            arr[i] *= 2;
        }
        return arr;
    }

    //写一个递归方法,递归求斐波那契数列的第 N 项
    public static int fun2(int n){
        if (n <= 2){
            return 1;
        }
            return fun2(n - 1) + fun2(n - 2);
    }


    //写一个递归方法，输入一个非负整数，返回组成它的数字之和
    public static int sumNum(int num){
        if (num < 10){
            return num;
        }
        return num % 10 + sumNum(num / 10);
    }


    //自定义方法:按顺序打印一个数字的每一位
    public static void printNum(int num){
        if (num < 10){
            System.out.println(num);
        } else {
            printNum(num / 10);
            System.out.println(num % 10);
        }
    }


    //自定义方法:递归求 1 + 2 + 3 + ... + 10
    public static int sum2(int n){
        if (n == 1) {
            return 1;
        }
        return n + sum2(n - 1);
    }

    //递归求 N 的阶乘
    //自定义方法求n!
    public static int fun1(int num){
        if (num == 1){
            return 1;
        }
        return num * fun1(num - 1);
    }


    //在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值
    public static int max(int n1,int n2){
        if (n1 < n2){
            n1 = n2;
        }
        return n1;
    }
    public static int max(int n1,int n2,int n3){
        if (n1 < n2){
            n1 = n2;
        }
        if (n1 < n3){
            n1 = n3;
        }
        return n1;
    }

}
